const { WebSocketServer } = require("ws"); //  引入WebSocketServer模块
const Websocket = require("ws");
const WebSocket = require("ws"); //  引入WebSocket模块

//定义一个在线列表

const onLineList = []

//设置端口号
const wss = new WebSocket.Server({ port: 4090 });

// 如果ws就代表初始化成功

if(wss){
  console.log('WebSocket初始化成功')
}

// 进行连接

wss.on("connection", function connection(ws, request) {
//   获取对应的用户名，来进行展示连接
  const user = new URL(request.url, `http://${request.headers.host}`).searchParams.get('user');
  console.log(`${user} 已连接`)

//   设置欢迎语
  let welCome = JSON.stringify({
    type: "tips",
    content:"欢迎回来~"
  })

  ws.send(welCome, { binary: false });

  ws.on("error", (error) => {
    console.log("WebSocket error:", error);
  })

   //注册收到消息的事件

  ws.on("message", async function message(data) {
    const message = JSON.parse(data);
    switch (message.type) {
      case "init":
        if (message.userId) {
          ws.userId = message.userId;
          keepLatestOnlineList('online',message)
        }
        break;
      case "message":
        wss.clients.forEach(client => {
        //   遍历所有的客户端
          if(!message.timestamp) {
            message.timestamp = new Date().toISOString();
          }
          if (client.readyState === Websocket.OPEN) {
            //  如果客户端处于打开状态
            client.send(JSON.stringify(message), { binary: false }); //  发送消息
          }
        })
        break;
        default:
          break;
    }
  })
  ws.on("close", function() {
    keepLatestOnlineList("close", { userId: ws.userId });
  });
})

function keepLatestOnlineList(type, message) {
  let index = onLineList.findIndex(item => item.userId === message.userId); //  在在线列表中查找用户
  switch (type) {
    case "onLine":
      if (index === -1) {
        //  如果用户不在在线列表中，则添加用户
        onLineList.push({ userId: message.userId });
      }
      break;
    case "close":
      if (index !== -1) {
        //  如果用户在在线列表中，则删除用户
        onLineList.splice(index, 1);
        console.log("有客户被断开");
      }
      break;
    default:
      break;
  }
}
